/**
 * 字符串转换整数
 *
 * 请你来实现一个 myAtoi(string s) 函数，使其能将字符串转换成一个 32 位有符号整数。
 *
 * 函数 myAtoi(string s) 的算法如下：
 *
 * 空格：读入字符串并丢弃无用的前导空格（" "）
 * 符号：检查下一个字符（假设还未到字符末尾）为 '-' 还是 '+'。如果两者都不存在，则假定结果为正。
 * 转换：通过跳过前置零来读取该整数，直到遇到非数字字符或到达字符串的结尾。如果没有读取数字，则结果为0。
 * 舍入：如果整数数超过 32 位有符号整数范围 [−231,  231 − 1] ，需要截断这个整数，使其保持在这个范围内。
 * 具体来说，小于 −231 的整数应该被舍入为 −231 ，大于 231 − 1 的整数应该被舍入为 231 − 1 。
 * 返回整数作为最终结果。
 */

/**
 * 没啥好的理解, 直接模拟, 处理好细节
 * 数组越界, 下标越界
 */

public class Main {

    // 记录数字的正负
    // 注意不能定义为 static, leetcode 会报错过不去
    // static boolean flag = false;
    boolean flag = false;

    public int myAtoi(String s) {

        int n = s.length();
        int i = 0;

        // 排除数字前的空格
        while (i < n && s.charAt(i) == ' ') {
            i++;
        }

        // 全是空格就返回 0
        if (i == n) {
            return 0;
        }

        // 定义返回的数据
        long ret = 0;

        // 如果是负数就将 flag改为 true
        if (s.charAt(i) == '-') {

            flag = true;
            i++;

        }else if (s.charAt(i) == '+') {

            // 是正数不作为
            i++;

        }

        // 处理后面的数字
        for (int j = i; j < n; j++) {

            // 单独定义出来, 后续方便
            int x = s.charAt(j) - '0';

            // 判断 x 的范围, 因为是单独的数字, 所以范围肯定在 0 ~ 9 间
            if (x >= 0 && x <= 9) {

                // 在的话将前面的乘以10, 并加上这次的数字
                ret *= 10;
                ret += x;

            } else {

                // 如果数字不合法, 直接出去
                break;
            }

            // 判断是否超出数据范围, 这里要在里面判断一次, 防止数据超出 long的最大范围
            // 只要判断整数就可以了, 因为这里面没乘 -1 ,是正值
            if (ret >= Integer.MAX_VALUE) {
                break;
            }

        }

        // 判断是否为负数
        if (flag) {
            ret *= -1;
        }

        // 判断是否超出数据范围
        if (ret >= Integer.MAX_VALUE) {
            return Integer.MAX_VALUE;
        } else if (ret <= Integer.MIN_VALUE) {
            return Integer.MIN_VALUE;
        }

        return (int) ret;
    }

    public static void main(String[] args) {
        Main main = new Main();
        System.out.println(main.myAtoi("1337c0d3"));
    }
}